From 9e86472a65b5c7503fd5ba1b7148988e466ae57d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 27 Jan 2009 03:56:03 +0000 Subject: [PATCH] =?utf8?q?=20=20=20=20=20=20=20=20Bug=20322932=20=E2=80=93?= =?utf8?q?=20Always=20show=20icons=20on=20panel=20menus?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * gtk/gtk.symbols: * gtk/gtkimagemenuitem.[hc]: Add a property to override the show-menu-images setting for individual menuitems. Patch by William Jon McCann. svn path=/trunk/; revision=22230 --- ChangeLog | 9 +++ docs/reference/ChangeLog | 4 ++ docs/reference/gtk/gtk-sections.txt | 2 + gtk/gtk.symbols | 2 + gtk/gtkimagemenuitem.c | 102 ++++++++++++++++++++++++++-- gtk/gtkimagemenuitem.h | 3 + 6 files changed, 118 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 05de34ee49..461a1d2926 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-01-26 Matthias Clasen + + Bug 322932 – Always show icons on panel menus + + * gtk/gtk.symbols: + * gtk/gtkimagemenuitem.[hc]: Add a property to override the + show-menu-images setting for individual menuitems. Patch by + William Jon McCann. + 2009-01-26 Matthias Clasen * gtk/gtkbutton.c: Activate the action in a regular clicked diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 3962c50926..1376553cf8 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,7 @@ +2009-01-26 Matthias Clasen + + * gtk/gtk-sections.txt: Add new image menu item api + 2009-01-23 Matthias Clasen * === Released 2.15.1 === diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt index 8f9cc64868..4bfcb839ce 100644 --- a/docs/reference/gtk/gtk-sections.txt +++ b/docs/reference/gtk/gtk-sections.txt @@ -2041,6 +2041,8 @@ gtk_image_menu_item_new_with_label gtk_image_menu_item_new_with_mnemonic gtk_image_menu_item_get_use_stock gtk_image_menu_item_set_use_stock +gtk_image_menu_item_get_always_show_image +gtk_image_menu_item_set_always_show_image gtk_image_menu_item_set_accel_group GtkImageMenuItemClass diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 2ca4a6a7d5..a2195c0b03 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -2062,6 +2062,7 @@ gtk_image_set_pixel_size #if IN_HEADER(__GTK_IMAGE_MENU_ITEM_H__) #if IN_FILE(__GTK_IMAGE_MENU_ITEM_C__) +gtk_image_menu_item_get_always_show_image gtk_image_menu_item_get_image gtk_image_menu_item_get_type G_GNUC_CONST gtk_image_menu_item_get_use_stock @@ -2070,6 +2071,7 @@ gtk_image_menu_item_new_from_stock gtk_image_menu_item_new_with_label gtk_image_menu_item_new_with_mnemonic gtk_image_menu_item_set_accel_group +gtk_image_menu_item_set_always_show_image gtk_image_menu_item_set_image gtk_image_menu_item_set_use_stock #endif diff --git a/gtk/gtkimagemenuitem.c b/gtk/gtkimagemenuitem.c index 27b641f60d..a7bc429987 100644 --- a/gtk/gtkimagemenuitem.c +++ b/gtk/gtkimagemenuitem.c @@ -79,15 +79,17 @@ static void gtk_image_menu_item_activatable_reset (GtkActivatable GtkAction *action); typedef struct { - gchar *label; - gboolean use_stock; + gchar *label; + guint use_stock : 1; + guint always_show_image : 1; } GtkImageMenuItemPrivate; enum { PROP_0, PROP_IMAGE, PROP_USE_STOCK, - PROP_ACCEL_GROUP + PROP_ACCEL_GROUP, + PROP_ALWAYS_SHOW_IMAGE }; static GtkActivatableIface *parent_activatable_iface; @@ -150,6 +152,25 @@ gtk_image_menu_item_class_init (GtkImageMenuItemClass *klass) FALSE, GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + /** + * GtkImageMenuItem:always-show-image: + * + * If %TRUE, the menu item will ignore the #GtkSettings:gtk-menu-images + * setting and always show the image, if available. + * + * Use this property if the menuitem would be useless or hard to use + * without the image. + * + * Since: 2.16 + **/ + g_object_class_install_property (gobject_class, + PROP_ALWAYS_SHOW_IMAGE, + g_param_spec_boolean ("always-show-image", + P_("Always show image"), + P_("Whether the image will always be shown"), + FALSE, + GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + /** * GtkImageMenuItem:accel-group: * @@ -214,6 +235,9 @@ gtk_image_menu_item_set_property (GObject *object, case PROP_USE_STOCK: gtk_image_menu_item_set_use_stock (image_menu_item, g_value_get_boolean (value)); break; + case PROP_ALWAYS_SHOW_IMAGE: + gtk_image_menu_item_set_always_show_image (image_menu_item, g_value_get_boolean (value)); + break; case PROP_ACCEL_GROUP: gtk_image_menu_item_set_accel_group (image_menu_item, g_value_get_object (value)); break; @@ -239,6 +263,9 @@ gtk_image_menu_item_get_property (GObject *object, case PROP_USE_STOCK: g_value_set_boolean (value, gtk_image_menu_item_get_use_stock (image_menu_item)); break; + case PROP_ALWAYS_SHOW_IMAGE: + g_value_set_boolean (value, gtk_image_menu_item_get_always_show_image (image_menu_item)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -248,10 +275,14 @@ gtk_image_menu_item_get_property (GObject *object, static gboolean show_image (GtkImageMenuItem *image_menu_item) { + GtkImageMenuItemPrivate *priv = GET_PRIVATE (image_menu_item); GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (image_menu_item)); gboolean show; - g_object_get (settings, "gtk-menu-images", &show, NULL); + if (priv->always_show_image) + show = TRUE; + else + g_object_get (settings, "gtk-menu-images", &show, NULL); return show; } @@ -773,6 +804,69 @@ gtk_image_menu_item_get_use_stock (GtkImageMenuItem *image_menu_item) return priv->use_stock; } +/** + * gtk_image_menu_item_set_always_show_image: + * @image_menu_item: a #GtkImageMenuItem + * @always_show: %TRUE if the menuitem should always show the image + * + * If %TRUE, the menu item will ignore the #GtkSettings:gtk-menu-images + * setting and always show the image, if available. + * + * Use this property if the menuitem would be useless or hard to use + * without the image. + * + * Since: 2.16 + */ +void +gtk_image_menu_item_set_always_show_image (GtkImageMenuItem *image_menu_item, + gboolean always_show) +{ + GtkImageMenuItemPrivate *priv; + + g_return_if_fail (GTK_IS_IMAGE_MENU_ITEM (image_menu_item)); + + priv = GET_PRIVATE (image_menu_item); + + if (priv->always_show_image != always_show) + { + priv->always_show_image = always_show; + + if (image_menu_item->image) + { + if (show_image (image_menu_item)) + gtk_widget_show (image_menu_item->image); + else + gtk_widget_hide (image_menu_item->image); + } + + g_object_notify (G_OBJECT (image_menu_item), "always-show-image"); + } +} + +/** + * gtk_image_menu_item_get_always_show_image: + * @image_menu_item: a #GtkImageMenuItem + * @always_show: %TRUE if the menuitem should always show the image + * + * Returns whether the menu item will ignore the #GtkSettings:gtk-menu-images + * setting and always show the image, if available. + * + * Returns: %TRUE if the menu item will always show the image + * + * Since: 2.16 + */ +gboolean +gtk_image_menu_item_get_always_show_image (GtkImageMenuItem *image_menu_item) +{ + GtkImageMenuItemPrivate *priv; + + g_return_val_if_fail (GTK_IS_IMAGE_MENU_ITEM (image_menu_item), FALSE); + + priv = GET_PRIVATE (image_menu_item); + + return priv->always_show_image; +} + /** * gtk_image_menu_item_set_accel_group: diff --git a/gtk/gtkimagemenuitem.h b/gtk/gtkimagemenuitem.h index d379f6a24e..b82bdfd319 100644 --- a/gtk/gtkimagemenuitem.h +++ b/gtk/gtkimagemenuitem.h @@ -69,6 +69,9 @@ GtkWidget* gtk_image_menu_item_new_with_label (const gchar *label); GtkWidget* gtk_image_menu_item_new_with_mnemonic (const gchar *label); GtkWidget* gtk_image_menu_item_new_from_stock (const gchar *stock_id, GtkAccelGroup *accel_group); +void gtk_image_menu_item_set_always_show_image (GtkImageMenuItem *image_menu_item, + gboolean always_show); +gboolean gtk_image_menu_item_get_always_show_image (GtkImageMenuItem *image_menu_item); void gtk_image_menu_item_set_image (GtkImageMenuItem *image_menu_item, GtkWidget *image); GtkWidget* gtk_image_menu_item_get_image (GtkImageMenuItem *image_menu_item); -- 2.30.2